#if !defined(__APP_DEVICE_H__)
#define __APP_DEVICE_H__

#include "app_buff.h"
#include <pthread.h>

typedef struct
{
    char *dev_file_name; // 设备文件名
    int dev_fd;  // 设备文件描述符
    buffer_t *up_buffer; // 上行数据缓存区
    buffer_t *down_buffer; // 下行数据缓存区
    pthread_t dev_read_pthread; // 读线程
    int (*post_read)(char *, int); // 读后预处理函数 // 根据不同的芯片设置不同的预处理
    int (*priv_write)(char *, int); // 写前预处理函数
    int is_running; // 设备当前的运行状态
    long last_write_ts_ms; // 上次写操作的时间戳
    int write_interval_ms; // 写操作的间隔时间
}device_t;

/**
 * @brief 设备初始化
 * @param dev_file_name 设备的文件地址
 * @return 设备结构体指针
 */
device_t *app_device_init(char *dev_file_name);

/**
 * @brief 启动设备读取操作
 * @return 0: 成功, -1: 失败
 * @note 设备设置一个唯一的 \
 * 启动从蓝牙串口中读取数据 （上行线路的开端）\
 * 向消息队列模块中注册接受数据后的处理函数 （下行线路的开始）
 */
int app_device_start(void);

/**
 * @brief 从蓝牙芯片中读取数据（异步方法）
 */
void *app_device_read(void *arg);

/**
 * @brief 从缓冲区中读取数据 写入到mqtt中 （异步方法）
 */
void *app_device_send2mqtt(void *arg);

/**
 * @brief 从mqtt中接受数据 写入到缓冲区  （注册给消息队列模块）
 */
int app_device_recv_from_mqtt(char *json_data, int data_len);

/**
 * @brief 从下行缓冲区中读取数据 向蓝牙芯片中写入数据（异步方法）
 */
void *app_device_write(void *arg);

/**
 * @brief 设备的销毁
 */
void app_device_destroy(void);

#endif